const express = require('express');
const router = express.Router();
const CouponController = require('../controllers/couponController');
const { authenticateToken, requireAdmin } = require('../middleware/auth');
const { body } = require('express-validator');
const { handleValidationErrors } = require('../middleware/validation');

// 创建优惠券验证规则
const validateCreateCoupon = [
  body('name')
    .notEmpty()
    .withMessage('优惠券名称不能为空')
    .isLength({ max: 100 })
    .withMessage('优惠券名称不能超过100个字符'),
  body('name_en')
    .optional()
    .isLength({ max: 100 })
    .withMessage('英文名称不能超过100个字符'),
  body('description')
    .optional()
    .isLength({ max: 500 })
    .withMessage('描述不能超过500个字符'),
  body('description_en')
    .optional()
    .isLength({ max: 500 })
    .withMessage('英文描述不能超过500个字符'),
  body('type')
    .isIn(['percentage', 'fixed_amount', 'free_delivery'])
    .withMessage('优惠券类型必须是 percentage, fixed_amount 或 free_delivery'),
  body('value')
    .isFloat({ min: 0 })
    .withMessage('优惠券值必须是非负数'),
  body('min_order_amount')
    .optional()
    .isFloat({ min: 0 })
    .withMessage('最小订单金额必须是非负数'),
  body('max_discount_amount')
    .optional()
    .isFloat({ min: 0 })
    .withMessage('最大折扣金额必须是非负数'),
  body('usage_limit')
    .optional()
    .isInt({ min: 1 })
    .withMessage('使用次数限制必须是正整数'),
  body('usage_limit_per_user')
    .optional()
    .isInt({ min: 1 })
    .withMessage('每用户使用次数限制必须是正整数'),
  body('is_active')
    .optional()
    .isBoolean()
    .withMessage('激活状态必须是布尔值'),
  body('start_date')
    .isISO8601()
    .withMessage('开始日期格式不正确'),
  body('end_date')
    .isISO8601()
    .withMessage('结束日期格式不正确')
    .custom((value, { req }) => {
      if (new Date(value) <= new Date(req.body.start_date)) {
        throw new Error('结束日期必须晚于开始日期');
      }
      return true;
    }),
  body('applicable_categories')
    .optional()
    .isArray()
    .withMessage('适用分类必须是数组'),
  body('applicable_categories.*')
    .optional()
    .isInt({ min: 1 })
    .withMessage('分类ID必须是正整数'),
  body('applicable_items')
    .optional()
    .isArray()
    .withMessage('适用菜品必须是数组'),
  body('applicable_items.*')
    .optional()
    .isInt({ min: 1 })
    .withMessage('菜品ID必须是正整数'),
  handleValidationErrors
];

// 更新优惠券验证规则（与创建相同，但所有字段都是可选的）
const validateUpdateCoupon = [
  body('name')
    .optional()
    .notEmpty()
    .withMessage('优惠券名称不能为空')
    .isLength({ max: 100 })
    .withMessage('优惠券名称不能超过100个字符'),
  body('name_en')
    .optional()
    .isLength({ max: 100 })
    .withMessage('英文名称不能超过100个字符'),
  body('description')
    .optional()
    .isLength({ max: 500 })
    .withMessage('描述不能超过500个字符'),
  body('description_en')
    .optional()
    .isLength({ max: 500 })
    .withMessage('英文描述不能超过500个字符'),
  body('type')
    .optional()
    .isIn(['percentage', 'fixed_amount', 'free_delivery'])
    .withMessage('优惠券类型必须是 percentage, fixed_amount 或 free_delivery'),
  body('value')
    .optional()
    .isFloat({ min: 0 })
    .withMessage('优惠券值必须是非负数'),
  body('min_order_amount')
    .optional()
    .isFloat({ min: 0 })
    .withMessage('最小订单金额必须是非负数'),
  body('max_discount_amount')
    .optional()
    .isFloat({ min: 0 })
    .withMessage('最大折扣金额必须是非负数'),
  body('usage_limit')
    .optional()
    .isInt({ min: 1 })
    .withMessage('使用次数限制必须是正整数'),
  body('usage_limit_per_user')
    .optional()
    .isInt({ min: 1 })
    .withMessage('每用户使用次数限制必须是正整数'),
  body('is_active')
    .optional()
    .isBoolean()
    .withMessage('激活状态必须是布尔值'),
  body('start_date')
    .optional()
    .isISO8601()
    .withMessage('开始日期格式不正确'),
  body('end_date')
    .optional()
    .isISO8601()
    .withMessage('结束日期格式不正确'),
  body('applicable_categories')
    .optional()
    .isArray()
    .withMessage('适用分类必须是数组'),
  body('applicable_categories.*')
    .optional()
    .isInt({ min: 1 })
    .withMessage('分类ID必须是正整数'),
  body('applicable_items')
    .optional()
    .isArray()
    .withMessage('适用菜品必须是数组'),
  body('applicable_items.*')
    .optional()
    .isInt({ min: 1 })
    .withMessage('菜品ID必须是正整数'),
  handleValidationErrors
];

// 验证优惠券验证规则
const validateCouponCode = [
  body('code')
    .notEmpty()
    .withMessage('优惠券代码不能为空')
    .isLength({ min: 3, max: 50 })
    .withMessage('优惠券代码长度必须在3-50个字符之间'),
  body('order_amount')
    .optional()
    .isFloat({ min: 0 })
    .withMessage('订单金额必须是非负数'),
  body('order_items')
    .optional()
    .isArray()
    .withMessage('订单项必须是数组'),
  body('order_items.*.menu_item_id')
    .optional()
    .isInt({ min: 1 })
    .withMessage('菜品ID必须是正整数'),
  body('order_items.*.quantity')
    .optional()
    .isInt({ min: 1 })
    .withMessage('数量必须是正整数'),
  body('order_items.*.total_price')
    .optional()
    .isFloat({ min: 0 })
    .withMessage('总价必须是非负数'),
  handleValidationErrors
];

// 领取优惠券验证规则
const validateClaimCoupon = [
  body('coupon_id')
    .isInt({ min: 1 })
    .withMessage('优惠券ID必须是正整数'),
  handleValidationErrors
];

// 批量发放优惠券验证规则
const validateBatchDistribute = [
  body('coupon_id')
    .isInt({ min: 1 })
    .withMessage('优惠券ID必须是正整数'),
  body('user_ids')
    .isArray({ min: 1 })
    .withMessage('用户ID列表不能为空'),
  body('user_ids.*')
    .isInt({ min: 1 })
    .withMessage('用户ID必须是正整数'),
  handleValidationErrors
];

// 需要认证的路由
router.use(authenticateToken);

// 用户优惠券路由
router.get('/available', CouponController.getAvailableCoupons);
router.get('/my-coupons', CouponController.getUserCoupons);
router.get('/:id', CouponController.getCouponDetail);
router.get('/code/:code', CouponController.getCouponByCode);
router.post('/validate', validateCouponCode, CouponController.validateCoupon);
router.post('/claim', validateClaimCoupon, CouponController.claimCoupon);

// 管理员优惠券路由
router.get('/admin/all', requireAdmin, CouponController.getAllCoupons);
router.post('/admin/create', requireAdmin, validateCreateCoupon, CouponController.createCoupon);
router.put('/admin/:id', requireAdmin, validateUpdateCoupon, CouponController.updateCoupon);
router.delete('/admin/:id', requireAdmin, CouponController.deleteCoupon);
router.post('/admin/batch-distribute', requireAdmin, validateBatchDistribute, CouponController.batchDistributeCoupons);
router.get('/admin/statistics', requireAdmin, CouponController.getCouponStatistics);

module.exports = router;